

package com.wedu.modules.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wedu.common.exception.RRException;
import com.wedu.common.utils.PageUtils;
import com.wedu.common.utils.Query;
import com.wedu.modules.sys.dao.SysConfigDao;
import com.wedu.modules.sys.redis.SysConfigRedis;
import com.google.gson.Gson;
import com.wedu.modules.sys.entity.SysConfigEntity;
import com.wedu.modules.sys.service.SysConfigService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.Map;

@Service("sysConfigService")//用于标注一个类作为服务类，该类的方法会被自动引入到对应的上下文中
public class SysConfigServiceImpl extends ServiceImpl<SysConfigDao, SysConfigEntity> implements SysConfigService {
	@Autowired//可以自动将所需的依赖注入类属性或方法中
	private SysConfigRedis sysConfigRedis;

	@Override//标注是否重写的注解
	public PageUtils queryPage(Map<String, Object> params) {
		String paramKey = (String)params.get("paramKey");//获取参数名，并把它转换成字符串类型

		IPage<SysConfigEntity> page = this.page(//根据条件进行分页查询
			new Query<SysConfigEntity>().getPage(params),//新建一个查询对象，从params中获取它的页码和每页条数
			new QueryWrapper<SysConfigEntity>()//实体封装操作类
				.like(StringUtils.isNotBlank(paramKey),"param_key", paramKey)//StringUtils是一个操作字符串的工具类
					//isNotBlank（）是判断是否不为空，，"param_key", paramKey， 模糊查询数据库param_key字段有数据包含参数paramKey的，并且拼接了数据库status字段要等于1的条件
				.eq("status", 1)
		);

		return new PageUtils(page);//把分页数据封装到分页工具类中返回
	}

	@Override
	public void saveConfig(SysConfigEntity config) {
		this.save(config);//插入一条数据
		sysConfigRedis.saveOrUpdate(config);//用系统配置Redis的方法
	}

	@Override
	@Transactional(rollbackFor = Exception.class)//保证事务的一致性，方法抛出异常，就会回滚，数据库里面的数据也会回滚
	public void update(SysConfigEntity config) {
		this.updateById(config);//根据 Id 进行修改
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)//保证事务的一致性，类里面的方法抛出异常，就会回滚，数据库里面的数据也会回滚
	public void updateValueByKey(String key, String value) {
		baseMapper.updateValueByKey(key, value);//根据key，更新value，baseMapper提供了一些增删改查的方法，它会自动生成sql语句
		sysConfigRedis.delete(key);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)//保证事务的一致性，类里面的方法抛出异常，就会回滚，数据库里面的数据也会回滚
	public void deleteBatch(Long[] ids) {
		for(Long id : ids){
			SysConfigEntity config = this.getById(id);//根据 Id进行查询
			sysConfigRedis.delete(config.getParamKey());
		}

		this.removeByIds(Arrays.asList(ids));//根据id批量删除，Arrays.asList把数组转成集合列表
	}

	@Override
	public String getValue(String wx_init_password) {// 从参数中获取微信用户密码
		return null;
	}

}
